/**
 * @description `Array.prototype.splice(start, deleteCount, ...itemN)`
 * @description `start` 从 0 开始计算的索引
 * @description `start` 负索引从数组末尾开始计算——如果 -array.length <= start < 0，使用 start + array.length
 * @description `start` 如果 start < -array.length，使用 0
 * @description `start` 如果 start >= array.length，则不会删除任何元素，但是该方法会表现为添加元素的函数，添加所提供的那些元素
 * @description `start` 如果 start 被省略了（即调用 splice() 时不传递参数），则不会删除任何元素。这与传递 undefined 不同，后者会被转换为 0。
 */

/**
 * @description - move array item from `fromIndex` to `toIndex`
 * @param array {Array}
 * @param fromIndex {number} - range [-array.length, array.length - 1]
 * @param toIndex {number} - range [-array.length, Number.Infinity]
 * @returns array {Array}
 */
export const arrayMoveMutable = <T extends unknown[]>(array: T, fromIndex: number, toIndex: number): void => {
  const startIndex = fromIndex < 0 ? array.length + fromIndex : fromIndex

  if (startIndex >= 0 && startIndex < array.length) {
    const endIndex = toIndex < 0 ? array.length + toIndex : toIndex

    if (endIndex >= 0) {
      const [item] = array.splice(fromIndex, 1)
      array.splice(endIndex, 0, item)
    }
  }
}
